<?php
/**
 * Yjnic_Dispatcher 创建控制器类 工厂方法
 *
 * 将创建与使用分离，简化客户调用，负责控制器复杂的创建过程
 *
```
 *      //根据请求(?r=XXX.XXX)生成对应的接口服务，并进行初始化
 *      $api = PhalApi_ApiFactory::generateService();
```
 * @package     Yjnic
 * @license     http://www.phalapi.net/license GPL 协议 GPL 协议
 * @author      prettyyjnic <prettyyjnic@qq.com> 2015-10-28
 */

class Yjnic_Dispatcher {

	/**
     * 创建服务器
     * 根据客户端提供的接口服务名称和需要调用的方法进行创建工作，如果创建失败，则抛出相应的自定义异常
     *
     * 创建过程主要如下：
     * - 1、 是否缺少控制器名称和需要调用的方法
     * - 2、 控制器文件是否存在，并且控制器是否存在
     * - 3、 方法是否可调用
     * - 4、 控制器是否初始化成功
     *
     * @param boolen $isInitialize 是否在创建后进行初始化
     * @param string $_REQUEST['r'] 接口服务名称，格式：XXX.XXX
     * @return Yjnic_Dispatcher 自定义的控制器
     *
     * @uses Yjnic_Dispatcher::init()
     * @throws Yjnic_Exception 非法请求下返回400
     */
	static function init($isInitialize = TRUE) {
		$dispatcher = DI()->request->get('r', 'Index.Index');
		
		$dispatcherArr = explode('.', $dispatcher);

		if (count($dispatcherArr) < 2) {
            throw new Yjnic_Exception(
                'dispatcher illegal', 505
            );
        }

		list ($controller, $action) = $dispatcherArr;
	    $controller = 'Controller_' . ucfirst($controller);
        $action = lcfirst($action);

        if (!class_exists($controller)) {
            throw new Yjnic_Exception(
                "no such Controller as {$controller}", 505
            );
        }
        		
    	$class_ins = new $controller();
        	
    	if (!method_exists($class_ins, $action) || !is_callable(array($class_ins, $action))) {
            throw new Yjnic_Exception(
                "no such action as {$action}", 505
            );
    	}

        if ($isInitialize) {
            call_user_func(array($class_ins, $action));
        }
		
	}
	
}
